接下來要來做購物網站比較核心的內容了,從購物車到付款結帳內容比較多也比較連貫,這邊應該會多分幾天出來寫。今天會先完成 Session 購物車的前置作業。
Http是無狀態的協定也就是說每一個網頁都是一個獨立的 Request ,但是購物車是需要跨頁面保存的機制,需要用一些方法來保存狀態,這邊列出一些常用的解決方式:
從上面可以知道,每種方式各有利弊,應該要針對專案的型態來選擇適合的機制。
總和各項考量,我這邊會用 Session 來實作購物車
要用到 Session 就必須要註冊服務
到 Startup.cs
加入紅框內的程式碼來啟用 Session 服務
在專案裡新增一個 Helpers
資料夾 並新增 SessionHelper.cs
類別
這個類別可以幫助我們存取 Session 的內容
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OnlineShop.Helpers
{
public static class SessionHelper
{
//設定 Session 內容
public static void SetObjectAsJson(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
//取得 Session 內容
public static T GetObjectFromJson<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
//移除 Session
public static void Remove(this ISession session, string key)
{
session.Remove(key);
}
}
}
在做購物車之前,先來把連結購物車的按鈕做好
我們希望當點擊 [加入購物車] 按鈕能有一點回饋,但單純用 Alert 似乎又有點寒酸
這時候可以試試用 Toastr.js
來美化訊息欄
在前端引入 CDN 並加入 javascript:
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>
<script>
function ShowMessage() {
toastr["success"]("商品已加入購物車!");
}
</script>
在加入購物車的按鈕上 加上onclick="ShowMessage()"
<a class="stretched-link text-dark" onclick="ShowMessage()"
asp-controller="Cart" asp-action="AddtoCart" asp-route-Id="@item.product.Id">加入購物車</a>
當點擊 [加入購物車] 後,就會在頁面右上角顯示訊息
當然這時候的購物車還沒有任何作用,明天再繼續來把購物車功能和頁面完成。